/************************************************************************************************************************************************
 *   Copyright (C) 2008 by Denjs                                                                                                                *
 *   dplsoft@pisem.net                                                                                                                          *
 *   http://qdroid.berlios.de                                                                                                                   *
 * -----------------------------------------------------------------------                                                                      *
 *   This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or (at your option) any later version.                                      *
 *   This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of             *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.                                 *
 *   You should have received a copy of the GNU General Public License along with this program; if not, write to the                            *
 *   Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                                                  *
 * -------------------------------------------------------------------------------------------------------------------------------------------- *
 *     Эта программа является свободным программным обеспечением; вы можете распространять её и/или модифицировать в соответствии с лицензией   *
 *   GNU General Public License  (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU) версии 2.0 или более поздней - на ваш выбор.                         *
 *     Эта программа распространяется  в надежде что она будет вам полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, подразумеваемых или явных; без обещаний *
 *   полезности или применимости в конкретных условиях. Вы используете  данное ПО на свой страх и риск и сами полностью несете                  *
 *   ответственность за последствия. См. GNU General Public License (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU).                                  *
 *     Вы должны получить копию GNU General Public License (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU)с данным ПО; Если этого не случилось,       *
 *   обратитесь в Фонд Свободного Программного Обеспечения :                                                                                    *
 *   Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                                                  *
 * -------------------------------------------------------------------------------------------------------------------------------------------  *
 * Замечания для территории России: в соответствии с ГК РФ часть 4, начиная использовать данную программу (исполняемые файлы или исходные       *
 * тексты) вы автоматически соглашаетесь с данной лицензией.
 * Текст лицензии GNU GPL v.2 приводится в файлах COPYING и COPYING.RUS.UTF8 (перевод)
 ************************************************************************************************************************************************/



/*

Правила именования элементов:

Имена созданных классов
	t_ClassName
	семантические части - с большой буквы, в начале "t_" - "тип"
Имена методов созданных классов
 	method_name
	семантические части - разделяя подчеркиванием с малой буквы всё
Имена Объектов программы
	ObjectName
	семантические части - с большой буквы
Имена файлов заголовков и самих классов
	t_ClassName.h
	t_ClassName.cpp
	т.е. в полном соответсвии с именем класса
*/

/*
TODO create отладчик QTScript скриптов. (с другой стороны - будет доступен в QT 4.5)
TODO create реализовать Хранитель настроек/или опции для зарегистрированного скрипта
TODO create GUI класс прогресс-бар
ok create разобраться с созданием новых объектов из классов определенных в QT
brake определить создание объектов в QtScript сделал по модели фабрика объектов (HiveQueen)
OK разобраться с определением функций в контексте QTscript

TODO нужна оболочка t_color ?
TODO нужна оболочка t_brush ?

TODO нужно окно запрома директории или файла (?)

TODO! при перезапуске скрипта надо-бы иметь механизм проверки - существуют-ли уже какие-либо переменные или нет.
	пример - ПЕРЕзапускаем скрипт, и он создает новые окошки, а старые - "отваливаются".
	т.е. они висят, но сигнал-слот связи разрываются.

TODO! настройка/сохранение параметров скрипта до его запуска.
TODO! Поддержка русского в скриптах.

TODO print() -  ввести поддержку цвета сообщений.


TODO 2008.12.24 >-  Препроцессор (начаты работы). Сделать #include file.qsm
TODO 2008.12.25 >  доступ из скрипта к параметрам командной строки
			+ работа с именованными списками параметров
			 (2 стиля : varname=varvalue
			            -varname varvalue)
TODO 2008.12.25 >  запуск других скриптов с параметрами и получение возвращаемого результата.

*/
#include <QtCore>
#include <QCoreApplication>

#include <QtGui>
#include <QApplication>

#include <QtDebug>
#include <QtScript>

#include "./classes/t_QDroid.h"
//#include "./classes/t_DroidGui.h"
#include "./classes/t_StartSender.h"
#include "./version.h"
/*========================================================================*/
int DebugLevel=0;
/* 1..5 
1 - only critical errors 
3 - control poins log

5 - full processed data dump
 */

int main(int argc, char *argv[])
{
    bool useGUI = getenv("DISPLAY") != 0;
    if (DebugLevel>=3) qDebug() << getenv("DISPLAY");
    if (DebugLevel>=3) qDebug() << "useGUI = " << useGUI;

    //int retcode=0;
    t_StartSender *StartSender;
    t_QDroid *DroidHiveQueen;

    QApplication App(argc, argv, useGUI);

if (DebugLevel>=3) qDebug() << "main():[0011]:started!";
if (DebugLevel>=3) qDebug() << "Have " << argc << "arguments at command line";

//TODO setCodecForCStrings <<-- по идее сюда надо засунуть кодировку консоли что бы понимать руские пути в файлах.
QStringList ArgList;
ArgList=App.arguments(); //++ 2009.09.05
//for (int q=0;q<argc;q++)
//пробежимся по списку опций
for (int q=0;q<ArgList.size();q++)
  {
    //ArgList.append(QString(argv[q]));

    //if (DebugLevel>=3)
            //qDebug() <<" arg"<<q<<" = ["<< ArgList.at(q) <<"]";

    //если находим некоторые указания - ихнадо выполнить сейчас
    // и выйти.
    if (ArgList.at(q)==QString("--version"))
       {
            qDebug() << "QDroid framework version "<< Version <<"\n";
            return 0;
       }
  }; /**/


DroidHiveQueen = new t_QDroid(NULL);// это и есть наш диспетчер :)
DroidHiveQueen->useGui = useGUI;
DroidHiveQueen->platformVersion = Version;

/*
  here we will try to create an object to emit asincronius signal
  to QDroid object before event loop starting.
  That is all for start system-building inside activated event-loop.
  We needs normal event processing during initiation.

      "Собирать" систему нам нужно когда работает EventLoop.
      т.е. DroidHive->init() должен сработать уже после app.exec().
      Но app.exec() "засыпает" пока не выполнен app.exit() или app.quit().

      Для запуска иницииации внутри потока событий, создается объект-пустышка,
      он генерирует асинхронный сигнал на init() и после этого запускается поток событий.
      Сгенерированный сигнал будет доставлен с первым циклом работы event loop,
      и с его получением начнется инициация системы.
    */

    StartSender = new t_StartSender(NULL);
    QObject::connect(StartSender,SIGNAL(start_a(QStringList)),DroidHiveQueen,SLOT(init(QStringList)),Qt::QueuedConnection); // <<--- важно что бы сигнал отправился только с началом работы цикла обработки событий
    //QObject::connect(StartSender,SIGNAL(start_b()),DroidHiveQueen,SLOT(init2()),Qt::QueuedConnection);//testing one

    /* creating signal(s) to be delivered as soon as event loop starts */

    StartSender->send_start_a(ArgList);//arglist added 2008.12.25
    //StartSender->send_start_b(); //testing one

    if (DebugLevel>=3) qDebug() << "main():[0071]:Event Loop Started!";
    /*and for starting event loop*/
    return App.exec();

}
